"""
作者：元明
日期：2023年11月11日
"""

'''
按面向过程函数实现的学生管理系统的需求，将学生管理系统修改为面向对象方式实现

在现有功能基础上，需将程序运行中操作的数据保存到 data.txt 文件中

程序退出时保存数据到文件

程序启动时从文件加载数据到程序

'''

#  定义一个学生类
import os


class Student():
    def __init__(self, sid, name):
        self.sid = sid
        self.name = name

    # 重写对象的显示格式 方法
    def __str__(self):
        return f"SID:{self.sid} --- Name:{self.name}"


# 封装管理类
class SMS():
    def __init__(self):
        # 定义一个全局变量，用来保存学生的信息。
        self.__student = []
        # 加载数据
        self.__load__data()

    def __menu(self):
        print("****************************************")
        print("*				学生管理系统			 *")
        print("*  	    1. 添加新学生信息              *")
        print("* 	    2. 通过学号修改学生信息		 *")
        print("*		3. 通过学号删除学生信息		 *")
        print("*		4. 通过姓名删除学生信息		 *")
        print("* 	    5. 通过学号查询学生信息          *")
        print("*		6. 通过姓名查询学生信息          *")
        print("*		7. 显示所有学生信息             *")
        print("*		8. 退出系统			  		 *")
        print("****************************************")

    # 管理函数
    def start(self):
        while True:
            self.__menu()
            select_op = input("请输入编号选择操作：")
            if len(select_op) == 1 and select_op in "12345678":
                if select_op == '1':
                    sid = self.__getSid()
                    sname = self.__getSname()
                    self.__addStudent(sid, sname)
                    self.__save__data()
                elif select_op == '2':
                    sid = self.__getSid()
                    self.__modifyStudentByID(sid)
                    self.__save__data()
                elif select_op == '3':
                    sid = self.__getSid()
                    self.__deleteStudentByID(sid)
                    self.__save__data()
                elif select_op == '4':
                    sname = self.__getName()
                    self.__deleteStudentByName(sname)
                    self.__save__data()
                elif select_op == '5':
                    sid = self.__getSid()
                    self.__queryStudentByID(sid)
                    self.__save__data()
                elif select_op == '6':
                    sname = self.__getSname()
                    self.__queryStudentByName(sname)
                    self.__save__data()
                elif select_op == '7':
                    self.__show()
                else:
                    break
            else:
                print("输入的数据不合法，请输入在合法范围内的操作编号！！！！")

    # 向文件中写入数据，进行持久化存储
    def __save__data(self):
        with open("data.txt", "w") as file:
            for s in self.__student:
                s_str = f"{s.sid} - {s.name}\n"
                file.write(s_str)

    # 从文件中读取数据，加载到内存
    def __load__data(self):
        # if os.path.exists("db20231115.txt"):
        with open("data.txt", "r") as file:
            content = file.read().split()
            for s in content:
                s = s.split(", ")
                stu = Student(*s)
                self.__student.append(stu)

    # 获取学生 id 的方法
    def __getSid(self):
        sid = input("请输入学生 ID:")
        return sid

    # 获取学生姓名的方法
    def __getSname(self):
        name = input("请输入学生姓名:")
        return name

    # 添加学生
    def __addStudent(self, sid, name):
        for s in self.__student:
            if s.sid == sid:
                print("学号已存在，添加失败")
                return "添加失败"
        else:
            student = Student(sid, name)
            self.__student.append(student)
            print("添加学生信息成功")
            return "添加成功"

    # 通过学号修改学生信息
    def __modifyStudentByID(self, sid):
        for s in self.__student:
            if s.sid == sid:
                name = self.__getSname()
                s.name = name
                print("修改成功")
                return "修改成功"
        else:
            print(f"没有{sid}对应的学生信息")
            return "修改失败"

    # 通过 ID 删除学生信息
    def __deleteStudentByID(self, sid):
        for s in self.__student:
            if s.sid == sid:
                self.__student.remove(s)
                print("删除成功")
                return "删除成功"
        else:
            print(f"没有 {sid}对应的学生信息")
            return "删除失败"

    # 通过学生 姓名  删除所有符合的学生
    def __deleteStudentByName(self, name):
        exist_s = []
        for s in self.__student:
            if s.name.upper() == name.upper():
                exist_s.append(s)

            # 开始删除
            if len(exist_s) > 0:
                for s in exist_s:
                    self.__student.remove(s)
                    print(f"姓名为 {name} 的学生删除成功")
                else:
                    print(f"成功删除{len(exist_s)} 个学生")
                    return "删除成功"
            else:
                print(f"姓名为{name}不存在，无法删除")
                return "删除失败"

    # 通过学号查询学生信息
    def __queryStudentByID(self, sid):
        for s in self.__student:
            if s.sid == sid:
                print(s)
                return "查询成功"
        else:
            print(f"学号{sid}的学生不存在")
            return "查询失败"

    # 通过姓名查询学生信息
    def __queryStudentByName(self, name):
        result = []
        for s in self.__student:
            if s.name.lower() == name.lower():
                result.append(s)
        if len(result) > 0:
            for s in result:
                print(s)
            return "查询成功"
        else:
            print("查询失败")
            return "查询失败"

    # 显示所有学生信息
    def __show(self):
        for s in self.__student:
            print(s)


if __name__ == '__main__':
    sms = SMS()
    sms.start()
